Содержание

3. Отличия в интерфейсах

Глава описывает любые отличия в поведении системных компонент на Эльбрусе, из-за которых может понадобиться адаптация программ для их корректной работы.

3.1. Совместимость с компиляторами

Компилятор lcc стремится к максимальной совместимости с gcc. Версия lcc-1.24 соответствует gcc-7.3.0.

3.1.1. Конструкции языка

3.1.1.1. Variable length array inside a struct

Не поддержана недокументированная функция gcc: Variable length arrays (VLA) в середине структуры.

3.1.1.2. Nested functions

Не поддержан элемент диалекта GNU C: nested functions.

3.1.2. gcc builtins

Ряд билтинов (builtin) gcc поддержан с ограничениями. Некоторые из них вызваны особенностями реализации компилятора, другие отсутствием практической необходимости. С выходом новых версий lcc расширяется состав поддержанных билтинов.

Ограничения перечислены в разделе документации на компилятор:

/opt/mcst/doc/builtin_gnu.html.

3.1.3. Прагмы

Информация о поддержанных прагмах в документации компилятора:

/opt/mcst/doc/pragma.html

3.1.4. OpenMP

3.1.4.1. Возможности

  • Поддержан стандарт OpenMP 3.1.

  • Доступны языки C, C++, Fortran.

3.1.4.2. Ограничения

  • Для e2k не поддержано в режиме -m128.

  • Nested параллелизм не поддержан. Если при исполнении уже распараллеленного цикла встречаются циклы, которые нужно распараллелить, то эти (вложенные) циклы будут исполняться последовательно.

  • Не поддержан clause collapse.

  • Для C/C++ после директивы #pragma omp всегда должен следовать statement языка. Проблемы могут возникнуть для #pragma omp barrier и #pragma omp flush, если за ними нет statement’а. Для обхода проблемы рекомендуется в следующей строке поставить пустой statement, например “0;” или “;”

  • Переменные, перечисленные в clause’ах private, lastprivate, firstprivate и threadprivate должны иметь скалярный базовый тип или массив скалярного базового типа. В противном случае результат программы неопределен.

  • Директива #pragma omp for не поддержана для итераторов C++.

  • Для C/C++ clause’ы if и num_threads своими параметрами могут иметь только константы и переменные целого типа, выражения не допускаются.

3.1.4.3. Справочный файл

В компиляторе информация об OpenMP хранится здесь:

/opt/mcst/doc/openmp.html

3.2. Системные интерфейсы

3.2.1. makecontext

Функция makecontext() для управления контекстом пользователя реализована на Эльбрусе с другой семантикой.

Отличия:

  • Вместо вызова makecontext() необходимо вызывать makecontext_e2k();

  • В конце области видимости необходимо вызвать freecontext_e2k().

  • makecontext_e2k() возвращает значение int, а не void. Значение вызова необходимо проверять на статус ошибки (< 0).

Функции дано другое название, чтобы отображать несовместимость с реализацией на других архитектурах.